home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / ashe-1.1 / xhtml.c < prev    next >
C/C++ Source or Header  |  1995-05-15  |  12KB  |  391 lines

  1. #include "xhtml.h"
  2. #include "xfile.h"
  3. #include "xheader.h"
  4. #include "xmarkup.h"
  5. #include "xstyles.h"
  6. #include "xviewer.h"
  7. #include "xtrans.h"
  8. /*
  9.  * xhtml.c - (c) 1994 Copyright by John R. Punin
  10.  *
  11.  * * main. *
  12.  * 
  13.  *   A Simple HTML Editor  (ASHE)
  14.  *
  15.  *   John R. Punin            Feb - 26 - 1994
  16.  */
  17.  
  18. /*
  19.    ASHE is A Simple HTML Editor with the purpose to help the user to
  20.    write HyperText Markup Language documents to be used in the World Wide Web
  21.    project. This program is written using programming language C, NCSA HTML
  22.    Widget and Motif Osf Windows. ASHE's visual interface was based on the 
  23.    visual interface of XMosaic. 
  24.  
  25.    This program is based on a simple editor. Most of the main key bindings
  26.    for emacs are implemented here with the purpose that the user can easily 
  27.    move and edit a file without using the mouse. 
  28.  
  29.    The visual interface of the program is based on a widget hierarchy where the
  30.    main_widget is the child of the top_level_widget. The main_widget has 
  31.    two children a menubar and workarea. The menubar widget has all menus 
  32.    as a children. The workarea is a paned widget with
  33.    the purpose to let the user resize the windows any time.
  34.  
  35.    The workarea has as a main child ,the text widget, where the user is 
  36.    going to write the HTML document. Other children are the label widgets
  37.    to send messages to the user such as errors, title of the documents and
  38.    name of the files.
  39. */
  40.  
  41. HTML_LIST *head_html=NULL;
  42. HTML_LIST *tail_html=NULL;
  43. MyAppResType myAppRes;
  44. XtTranslations trans_table;
  45.  
  46. void
  47. main(int argc, char **argv)
  48. {
  49.     XtAppContext app_context;    /* Application Context */
  50.   
  51.     Widget  top_level_widget;    /* Application Shell   */
  52.     HTMLED *he=NULL,*ohe=NULL;
  53.     
  54. /*    
  55.     Name_File[0]='\0';
  56.     last_command = NONE;
  57.     getwd(Home);  *//* Get the current Directory */
  58.  
  59.     /*
  60.      * * Initialize toolkit
  61.      */
  62.     app_context = XtCreateApplicationContext();
  63.     
  64.     top_level_widget = XtVaAppInitialize(
  65.                      &app_context,    /* app_context  */
  66.                      "XHTML",    /* Class        */
  67.                      NULL,    /* options      */
  68.                      0,    /* num_options  */
  69.                      &argc,    /* num cmd line */
  70.                      argv,    /* cmd line     */
  71.                      fallbacks,    /* fallback     */
  72.                      NULL    /* args         */
  73.  
  74.     );
  75.  
  76.     if(argv[1]!=NULL)
  77.     {
  78.        ohe = (HTMLED *)XtMalloc(sizeof(HTMLED));
  79.        initialize_editor(ohe);
  80.        ohe->href=XtMalloc(strlen(argv[1])+1);
  81.        strcpy(ohe->href,argv[1]);
  82.        ohe->anchor_target = NULL;
  83.     }
  84.     else
  85.        ohe = NULL;
  86.  
  87.     /* Getting HTML Directory Resource */
  88.     XtGetApplicationResources(top_level_widget,&myAppRes, resources,
  89.                   XtNumber(resources),NULL,0);
  90.  
  91.     Initialize_list();
  92.     /* Initialize Translation Table */
  93.     trans_table = XtParseTranslationTable(emacs_translations);
  94.     he = create_rest_widgets(top_level_widget,ohe);
  95.     
  96.     if(ohe)
  97.     {
  98.        XtFree(ohe->href);
  99.        XtFree((char *)ohe);
  100.     }
  101.     Insert_html_frame(he);
  102.     /*Print_Frames();*/
  103.     he->shell = top_level_widget;
  104.  
  105.     XtRealizeWidget(top_level_widget);
  106.  
  107.     XtAppMainLoop(app_context);
  108.  
  109. }
  110.  
  111. HTMLED *create_rest_widgets(Widget shell,HTMLED *ohe)
  112. {
  113.    HTMLED *he=NULL;
  114.    Widget  main_widget;    /* Main window.        */
  115.    Widget  menubar;        /* Menu bar            */
  116.    Widget  workarea;        /* Pane                */
  117.    Widget  buttonbox;        /* Form                */
  118.    Widget  html_widget;         /* HTML Widget         */
  119.    Widget  text_output,title_output,
  120.            file_output,textarea;
  121.    Widget  bopen,blight,
  122.            parag,btitle,reload,
  123.            header,print,clear,
  124.            undo,link,prefor,item;                /* pushbuttons.        */
  125.    Arg     arglist[MAXARGS];
  126.    int     narg,flag;
  127.  
  128.  
  129.    he = (HTMLED *)XtMalloc(sizeof(HTMLED));
  130.    initialize_editor(he);
  131.        /* We are going to use a Motif MainWindow Widget here. */
  132.  
  133.     main_widget = XtVaCreateManagedWidget("main", xmMainWindowWidgetClass, 
  134.                       shell, NULL);
  135.  
  136.     /*
  137.      * The Motif Menubar. * See the CreateMenubar function for all the steps
  138.      */
  139.     menubar= CreateMenuBar(main_widget,he);
  140.  
  141.     /*
  142.      * * Create the Paned Widget
  143.      */
  144.     workarea = XtVaCreateManagedWidget("workarea", xmPanedWindowWidgetClass, 
  145.                        main_widget, NULL);
  146.  
  147.     /*
  148.      *  Create Text widget for messages
  149.      */
  150.  
  151.     text_output = XtVaCreateManagedWidget("text_out",
  152.                       xmLabelWidgetClass,workarea,
  153.                       XmNshadowThickness, 0,
  154.                       NULL);
  155.  
  156.     XtManageChild(text_output);
  157.     he->text_output = text_output;
  158.  
  159.     title_output = XtVaCreateManagedWidget("title_out",
  160.                       xmLabelWidgetClass,workarea,
  161.                       NULL);
  162.  
  163.     XtManageChild(title_output);      
  164.    
  165.     he->title_output = title_output;
  166.     /*
  167.      * * Create the Text child, and the button children.
  168.      */
  169.  
  170.     narg = 0;
  171.     XtSetArg(arglist[narg],XmNrows ,20 ); narg++;
  172.     XtSetArg(arglist[narg],XmNcolumns ,80 ); narg++;
  173.     XtSetArg(arglist[narg],XmNresizeWidth ,False ); narg++;
  174.     XtSetArg(arglist[narg],XmNresizeHeight ,False ); narg++;
  175.     XtSetArg(arglist[narg],XmNscrollingPolicy ,XmAUTOMATIC ); narg++;
  176.     XtSetArg(arglist[narg],XmNeditMode ,XmMULTI_LINE_EDIT ); narg++;
  177.  
  178.     
  179.     textarea = XmCreateScrolledText(workarea,"text",arglist,narg);
  180.     XtOverrideTranslations(textarea,trans_table);
  181.     XtManageChild(textarea);
  182.  
  183.     he->textarea = textarea;
  184.     html_widget = CreateHTMLwidget(workarea,he);
  185.  
  186.     he->html_text = html_widget;
  187.  
  188.     file_output = XtVaCreateManagedWidget("file_out",
  189.                        xmLabelWidgetClass,workarea,
  190.                        NULL);
  191.  
  192.  
  193.     XtManageChild(file_output);
  194.     he->file_output = file_output;
  195.  
  196.    /* Setting the new window */
  197. /*    if((ohe == NULL)||
  198.        (!strcmp(ohe->href,"*scratch*")))*/ /* Problem with Linux */
  199.  
  200.    narg = 0;
  201.    if(ohe == NULL)
  202.       narg = 1;
  203.    else if (!strcmp(ohe->href,"*scratch*"))
  204.       narg = 1;
  205.  
  206.    if(narg)
  207.     {
  208.        Set_label(text_output,"ASHE (A Simple HTML Editor)");
  209.        Set_label(title_output,"");
  210.        XmTextSetString(textarea,XTEXT_STRING);
  211.        Set_label(file_output," *scratch* ");
  212.     }
  213.     else
  214.     {
  215.        if(ohe->anchor_target != NULL)
  216.        {
  217.       he->anchor_target = XtMalloc(strlen(ohe->anchor_target)+1);
  218.       strcpy(he->anchor_target,ohe->anchor_target);
  219.        }
  220.        read_file(ohe->href,he);
  221.     }
  222.     
  223.     /*
  224.      * * Create the form to hold the file, save, clear and print buttons.
  225.      */
  226.     buttonbox = XmCreateForm(workarea, "buttonbox", NULL, 0);
  227.     XtManageChild(buttonbox);
  228.     XtVaSetValues(buttonbox,XmNuserData,he,NULL);
  229.  
  230.     print = XmCreatePushButton(buttonbox, "print", NULL, 0);
  231.     XtManageChild(print);
  232.     clear = XmCreatePushButton(buttonbox, "clear", NULL, 0);
  233.     XtManageChild(clear);
  234.     bopen = XmCreatePushButton(buttonbox, "open", NULL, 0);
  235.     XtManageChild(bopen);
  236.     reload = XmCreatePushButton(buttonbox, "reload", NULL, 0);
  237.     XtManageChild(reload);
  238.     btitle =XmCreatePushButton(buttonbox, "title", NULL, 0);
  239.     XtManageChild(btitle); 
  240.     parag =XmCreatePushButton(buttonbox, "paragraph", NULL, 0);
  241.     XtManageChild(parag); 
  242.     header = XmCreatePushButton(buttonbox, "header", NULL, 0);
  243.     XtManageChild(header);
  244.     link = XmCreatePushButton(buttonbox, "link", NULL, 0);
  245.     XtManageChild(link);
  246.     prefor = XmCreatePushButton(buttonbox, "prefor", NULL, 0);
  247.     XtManageChild(prefor);
  248.     item = XmCreatePushButton(buttonbox, "item", NULL, 0);
  249.     XtManageChild(item);
  250.     undo = XmCreatePushButton(buttonbox, "undo", NULL, 0);
  251.     XtManageChild(undo);
  252.     blight = XmCreateToggleButton(buttonbox, "mark_tags", NULL, 0);
  253.     XtVaSetValues(blight,
  254.           XtVaTypedArg,XmNlabelString,XmRString,"mark tags",10,NULL);
  255.     XtManageChild(blight);
  256.  
  257.     /* Tell the buttons how to position themselves in the form. */
  258.  
  259.  
  260.     XtVaSetValues(clear, XmNleftAttachment, XmATTACH_WIDGET, 
  261.           XmNleftWidget, print, NULL);
  262.     XtVaSetValues(bopen, XmNleftAttachment, XmATTACH_WIDGET, 
  263.           XmNleftWidget, clear, NULL);
  264.     XtVaSetValues(reload, XmNleftAttachment, XmATTACH_WIDGET, 
  265.           XmNleftWidget, bopen, NULL);
  266.     XtVaSetValues(btitle, XmNleftAttachment, XmATTACH_WIDGET, 
  267.           XmNleftWidget, reload,NULL);
  268.     XtVaSetValues(parag, XmNleftAttachment, XmATTACH_WIDGET, 
  269.           XmNleftWidget, btitle, NULL);
  270.     XtVaSetValues(header, XmNleftAttachment, XmATTACH_WIDGET, 
  271.           XmNleftWidget, parag, NULL);
  272.     XtVaSetValues(link, XmNleftAttachment, XmATTACH_WIDGET, 
  273.           XmNleftWidget, header, NULL);
  274.     XtVaSetValues(prefor, XmNleftAttachment, XmATTACH_WIDGET, 
  275.           XmNleftWidget, link, NULL);
  276.     XtVaSetValues(item, XmNleftAttachment, XmATTACH_WIDGET, 
  277.           XmNleftWidget, prefor, NULL);
  278.     XtVaSetValues(undo, XmNleftAttachment, XmATTACH_WIDGET, 
  279.           XmNleftWidget, item, NULL);
  280.     XtVaSetValues(blight, XmNleftAttachment, XmATTACH_WIDGET, 
  281.           XmNleftWidget, undo, NULL);
  282.  
  283.  
  284.     /* Add the callback to verify the input to the text */
  285.     XtAddCallback(textarea, XmNmodifyVerifyCallback, 
  286.           (XtCallbackProc)verify_text, (XtPointer)he);
  287.     XtAddCallback(textarea,XmNlosingFocusCallback,(XtCallbackProc)Setmenu,
  288.           (XtPointer)he);
  289.     /*XtAddCallback(textarea,XmNfocusCallback,(XtCallbackProc)gain_focus,NULL);*/
  290.  
  291.     XtAddCallback(html_widget, WbNanchorCallback, (XtCallbackProc)anchor_call,
  292.           (XtPointer)he);
  293.  
  294.  
  295.     /* Add the callbacks */
  296.  
  297.     XtAddCallback(print, XmNactivateCallback, 
  298.           (XtCallbackProc)PrintButtonCallBack,(XtPointer)he);
  299.  
  300.     XtAddCallback(clear, XmNactivateCallback, 
  301.           (XtCallbackProc)ClearButtonCallBack,(XtPointer)he);
  302.  
  303.     XtAddCallback(bopen, XmNactivateCallback, (XtCallbackProc)file_cb,
  304.           (XtPointer)1);
  305.  
  306.     XtAddCallback(reload, XmNactivateCallback,(XtCallbackProc) Reload_HTML,
  307.           (XtPointer)he);
  308.  
  309.     XtAddCallback(btitle, XmNactivateCallback, (XtCallbackProc)create_title,
  310.           (XtPointer)he);
  311.  
  312.     XtAddCallback(parag, XmNactivateCallback, (XtCallbackProc)create_paragraph,
  313.           (XtPointer)he);
  314.  
  315.     XtAddCallback(header, XmNactivateCallback, (XtCallbackProc)create_header,
  316.           (XtPointer)he);
  317.  
  318.     XtAddCallback(link, XmNactivateCallback, (XtCallbackProc)create_linker,
  319.           (XtPointer)he);
  320.  
  321.     XtAddCallback(prefor, XmNactivateCallback, (XtCallbackProc)create_pre,
  322.           (XtPointer)he);
  323.  
  324.     XtAddCallback(item, XmNactivateCallback, (XtCallbackProc)set_simple_entry,
  325.           (XtPointer)he);
  326.  
  327.     XtAddCallback(undo, XmNactivateCallback, (XtCallbackProc)create_undo,
  328.           (XtPointer)he);
  329.  
  330.     XtAddCallback(blight, XmNvalueChangedCallback,
  331.           (XtCallbackProc)Set_Underline_Tags,(XtPointer)he);
  332.  
  333.     /* Tell the MainWindow how to position its children */
  334.     XmMainWindowSetAreas(main_widget, menubar, NULL, NULL, NULL,
  335.              workarea);
  336.    return(he);
  337. }
  338.  
  339. void initialize_editor(HTMLED *he)
  340. {
  341.    he->shell = NULL;
  342.    he->textarea = NULL;
  343.    he->file_output = NULL;
  344.    he->text_output = NULL;
  345.    he->title_output = NULL;
  346.    he->html_text = NULL;
  347.    he->editwidget = NULL;
  348.    he->open_dialog = NULL;
  349.    he->save_dialog = NULL;
  350.    he->insert_dialog = NULL;
  351.    he->export_dialog = NULL;
  352.    he->user_data = NULL;
  353.    he->header_num = 0;
  354.    he->fonts = TIMES;
  355.    he->export_option = PTEXT;
  356.    he->modified_file=FALSE;
  357.    he->toggle_mark_tag = FALSE;
  358.    he->method = GET;
  359.    he->last_command = NONE;
  360.    strcpy(he->Name_File,"*scratch*");
  361.    he->format_file = NULL;
  362.    he->warning = NULL;
  363.    he->href = NULL;
  364.    he->anchor_target = NULL;
  365.    he->text_cleared = NULL;
  366.    he->undo_buffer.ubuffer[0] = '\0';
  367.    he->undo_buffer.right = 0;
  368.    he->undo_buffer.left = 0;
  369.    he->undo_buffer.lenleft =0;
  370.    he->undo_buffer.lenright = 0;
  371.    he->undo_buffer.com_html = NONE;
  372. }
  373.  
  374.  
  375. void 
  376. gain_focus(Widget w, XtPointer cld, XtPointer cd)
  377. {
  378.    XmTextShowPosition(w,XmTextGetCursorPosition(w));
  379. }
  380.  
  381. void 
  382. Initialize_list(void)
  383. {
  384.    head_html = (HTML_LIST *)XtMalloc(sizeof(HTML_LIST));
  385.    tail_html = (HTML_LIST *)XtMalloc(sizeof(HTML_LIST));
  386.    head_html->fr = NULL;
  387.    tail_html->fr = NULL;
  388.    head_html->next = tail_html;
  389.    tail_html->next = NULL;
  390. }
  391.